12. 构造函数
声明构造函数
Python 和 C++ 都有构造函数。构造函数定义了对象实例化时会发生什么。
Python 构造函数
它们定义了对象实例化时会发生什么。在 Python 中,语法是:
def __init__(self, variable1, variable2, ..., variablen):
    self.variable1 = variable1
    self.variable2 = variable2
    self.variablen = variablenC++ 构造函数声明
在 C++ 中,构造函数声明如下:
Classname (datatype for variable1, datatype for variable2, …, datatype for variablen);你也可以同时声明一个默认的构造函数。
Classname ();实例化一个对象而不提供变量的值时,使用这个默认的构造函数。说得更具体一点,你将用一个二维向量来初始化一个矩阵变量。如果不提供二维向量,也可以使用默认向量来初始化矩阵变量。第二种情况中,可以使用空构造函数。
Gaussian 构造函数声明如下:
class Gaussian
{
    private:
        ...
    public:
        ...
        Gaussian ();
        Gaussian (float, float);
   ....
};定义构造函数
声明了构造函数后,你需要在 .cpp 文件中实际定义它们。
构造函数定义的语法如下:
//空构造函数的语法
Classname::ClassName() {
    constructor function definition
}
// constructor function syntax
Classname::ClassName(datatype variable1, datatype variable2, …, datatype variablen) {
    constructor function definition
}你可以看到这在 Gaussian 类中是如何实现的:
Gaussian::Gaussian() {
    mu = 0;
    sigma2 = 1; 
}
Gaussian::Gaussian (float average, float sigma) {
    mu = average;
    sigma2 = sigma;
}请注意,构造函数不返回任何内容。它们只会初始化类变量。你可能还想知道,如果 mu 和 sigma2 是私有变量,函数定义如何能访问这两个变量。请记住,私有变量可以从类代码内部访问,但不能从类外部访问。
使用默认值初始化
在 Python 和 C++ 中,都可以在构造函数中使用默认值。在 Python 中,语法是:
def __init__(self, variable1 = default1, variable2 = default2, ..., variablen = defaultn):
    self.variable1 = variable1
    self.variable2 = variable2
    self.variablen = variablenC++ 也有相同功能,但语法可能和所期望的不一样。默认值的定义实际上在 .h 文件函数定义中。下面一个加法类的简单例子,它包含两个整数并输出它们的总和。
以下为头文件 add.h:
class Add
{
    public:
        int a;
        int b;
        Add(int, int second = 17);
        int addition();
};这里是 add.cpp 中的定义:
# include  "add.h"
Add::Add(int first, int second) {
    a = first;
    b = second;
}
int Add::addition() {
    return a + b;
}请注意,默认值是在头文件中声明的。现在,如果在实例化 add 对象时只指定了一个值,则变量 b 将具有默认值 17:
# include <iostream>
# include  "add.h"
int main() {
    Add adder(5);
    std::cout << adder.addition() << std::endl;
    return 0;
}上述代码输出值 22。
声明并定义矩阵类构造函数
现在轮到你了。填充 matrix.h 文件和 matrix.cpp 文件中的 TODO 部分。
Start Quiz:
matrix.h 参考答案
# include <vector>
class Matrix 
{
        private:
            std::vector< std::vector<float> > grid;
            std::vector<int>::size_type rows;
            std::vector<int>::size_type cols;
        public:
            // 构造函数声明
            Matrix ();
            Matrix (std::vector< std::vector<float> >);
};matrix.cpp 参考答案
# include "matrix.h"
Matrix::Matrix() {
    std::vector <std:: vector <float> > initial_grid (10, std::vector <float>(5, 0.5));
    grid = initial_grid;
    rows = initial_grid.size();
    cols = initial_grid[0].size();
}
Matrix::Matrix(std::vector <std:: vector <float> > initial_grid) {
    grid = initial_grid;
    rows = initial_grid.size();
    cols = initial_grid[0].size();
}